///////////////////////////////////////////////////////////
//
// le widget permettant la saisie des temps
//
///////////////////////////////////////////////////////////


package com.switcherdav
{
    import flash.display.NativeWindow;
    import flash.display.NativeWindowInitOptions;
    import flash.display.NativeWindowSystemChrome;
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.ContextMenuEvent;
    import flash.events.MouseEvent;
    import flash.filesystem.File;
    import flash.filesystem.FileMode;
    import flash.filesystem.FileStream;
    import flash.system.Capabilities;
    import flash.ui.ContextMenu;
    import flash.ui.ContextMenuItem;
    
    import gs.TweenLite;
    
    import views.FrontView;

    public class SillajWidget extends NativeWindow
    {
        
        //////////////////////////
        // PROPRIETES
        //////////////////////////
        
        /* le rectangle dans lequel on va placer les elements*/
        private var sprite:Sprite ;
        
        /* le menu about*/
        private var aboutMenu:ContextMenuItem ;
        
        /* front view*/
        private var frontView:FrontView ;
        
        
        /* param file to communicate with sillaj DB*/
        private var paramFile:File ;
        private var fileStream:FileStream ;
        
        /* asset de sillaj */
 //       private var sillajAsset:SillajAsset ;
        
        /*les options*/
        //private var sillajOptions:SillajWidgetOption ;
        
        /*gestion du flip*/
        //private var flipToOptionEffect:FlipEffect ;
//        private var flipToFrontEffect:FlipEffect ;
        
        
        /*indique si le widget est ouvert ou fermé*/
        //private var isOpen:Boolean ;
        
        
        /*objet loader pour la recuperation des activites*/
        //private var activityLoader:URLLoader ;
        
        
        /*xml des options chargé au lancement de l'application*/
        //private var optionsXML:XML = new XML() ;
        
        
        /*objet pour les échanges avec la base de données*/
        //private var sillajSession:SillajSession ;
        
        
        
        
        
        
        
        
        
        
        //////////////////////////
        // METHODES
        //////////////////////////
        
        public function SillajWidget(  )
        {
            
            // make transparent window
            var winArgs:NativeWindowInitOptions = new NativeWindowInitOptions() ;
            winArgs.systemChrome = NativeWindowSystemChrome.NONE ;
            winArgs.transparent = true ;
            
            super( winArgs );      
                  
            /* initialize the stage*/
            initStage( ) ;
            
            /* add contextual menu*/
            initContextMenu( ) ;

            /*add views and hide the back one*/
            frontView = new FrontView( ) ;
            frontView.y = 50 ;
            frontView.x = 200 ;
            
            addListeners( ) ;
            
            sprite.addChild( frontView ) ;

            visible = true ;            
        }
        
        
        /**
        * prepare Stage
        */ 
        private function initStage( ):void
        {
            
            // toujours au dessus des autres fenetres du systeme
            this.alwaysInFront = true ;
                        
            
            sprite = new Sprite() ;
            
            /*configure le stage*/            
            stage.align = StageAlign.TOP_LEFT ;
            stage.scaleMode = StageScaleMode.NO_SCALE ;
            
            /*ajoute la scene*/
            stage.addChild( sprite ) ;
            
            // on positionne la scene
            this.width = Capabilities.screenResolutionX ;
            this.height = Capabilities.screenResolutionY ;
            
            this.x = 0 ;
            this.y = 0 ;
        }
        
        
        /**
        * initialize the context menu of the application
        */ 
        private function initContextMenu( ):void
        {
            stage.showDefaultContextMenu = true ;
         
            var cm:ContextMenu = new ContextMenu() ;
         
            cm.hideBuiltInItems() ;
            
            aboutMenu = new ContextMenuItem( "about" ) ;
            aboutMenu.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, onAboutMenu ) ;
         
            cm.customItems.push( aboutMenu ) ;
                        
            sprite.contextMenu = cm ;            
        }
        

        /**
        * what happened whith the about menu ....
        */
        private function onAboutMenu( e:ContextMenuEvent ):void
        {
            
        }  



       /**
        * add listeners to manage drag views
        * flip back and front
        * quit application
        */
        private function addListeners():void
        {
            
            frontView.addEventListener( MouseEvent.MOUSE_DOWN, view_onMouseDown ) ;
            frontView.addEventListener( MouseEvent.MOUSE_UP, view_onMouseUp ) ;
            // drag du widget
            /*
            sillajAsset.dragZone.addEventListener( MouseEvent.MOUSE_DOWN, onMouseDown ) ;
            sillajOptions.drag_zone.addEventListener( MouseEvent.MOUSE_DOWN, onMouseDown ) ;
            
                //fermeture du widget
            sillajAsset.bt_close.addEventListener( MouseEvent.CLICK, bt_close_onClick ) ;
            
            //ouvre ou ferme le widget
            sillajAsset.bt_plus.addEventListener( MouseEvent.CLICK, bt_plus_onClick ) ;
            
            //affiche les activités liées à un projet selectionné
            sillajAsset.combo_haut.addEventListener(Event.CHANGE, loadActivity ) ;
            
            //flip du widget pour afficher les options
            sillajAsset.bt_option.addEventListener(MouseEvent.CLICK, flipToOption ) ;        
            
            // flip du widget pour afficher la face principale
            sillajOptions.bt_done.addEventListener( MouseEvent.CLICK, flipToFront ) ;  
            
            //une fois la liste des projets chargée, mise à jour du combo
            sillajSession.addEventListener( SillajEvent.PROJETS_LOADED, loadProject_onComplete ) ;  
            */
        } 

        /**
        * start drag operation on selected view
        */ 
        private function view_onMouseDown( e:MouseEvent ):void
        {
            if( e.target is DragZone  )
            {
                e.currentTarget.startDrag( ) ;    
            }
        }
        
        /**
        * stop drag operation
        */ 
        private function view_onMouseUp( e:MouseEvent ):void
        {
            e.currentTarget.stopDrag( ) ; 
        }



       /**
        * load para file,
        * if doesn't exist, create empty one
        */
        private function loadParameters():void
        {
            paramFile = File.applicationStorageDirectory.resolvePath( "sillaj.xml" ) ;
            
            fileStream = new FileStream() ;
            
            //ouverture en lecture si le fichier existe, en écriture pour création dans le cas contraire
            if( paramFile.exists )
            {
                fileStream.open( paramFile, FileMode.READ ) ;     
               
                //optionsXML = XML( fileStream.readUTFBytes( fileStream.bytesAvailable ) ) ;
/*                
                sillajOptions.ti_url.text    = optionsXML.url ;
                sillajOptions.ti_user.text = optionsXML.user ;
                sillajOptions.ti_psw.text = optionsXML.psw ;
*/           
            }
            else
            {
                createEmptyParamFile( ) ;
            }
                                   
            fileStream.close() ;
            
        } 

        /**
        * create a empty param file
        */ 
        private function createEmptyParamFile( ):void
        {
                fileStream.open( paramFile, FileMode.UPDATE ) ;

                var xml:XML = <options><url></url><user></user><psw></psw></options>; 
 
                var outputString:String = '<?xml version="1.0" encoding="utf-8"?>\n'; 
                outputString += xml.toXMLString(); 
     
                fileStream.writeUTFBytes(outputString);             
        }




/*
====================================================================================
====================================================================================
====================================================================================
====================================================================================
====================================================================================
====================================================================================
====================================================================================
====================================================================================
====================================================================================
====================================================================================
====================================================================================
====================================================================================
====================================================================================
====================================================================================
*/        





        private function sa_onMouseDown( e:MouseEvent ):void
        {
            e.target.parent.startDrag() ;
        }

        private function sa_onMouseUp( e:MouseEvent ):void
        {
            e.target.parent.stopDrag() ;
        }
        
        
        
        private function flipToFrontFace( e:MouseEvent ):void
        {
            TweenLite.to( e.target.parent, 10, { rotationY:360  } ) ;
        }
        
        
        
        
        

        
        /**
        * place les elements
        */
        private function addElements():void
        {
            /*ajout de la face avant*/
            /*
            sillajAsset = new SillajAsset() ;
            sillajAsset.x = 200 ;
            sillajAsset.y = 200 ;
            sprite.addChild( sillajAsset ) ;
            */
            
            
            /*add flip effect*/
            /*
            sillajOptions = new SillajWidgetOption() ;
            sillajOptions.x = 200 ;
            sillajOptions.y = 200 ;
            sprite.addChild( sillajOptions ) ;
            
            flipToOptionEffect = new FlipEffect( sillajAsset, sillajOptions ) ;
            sprite.addChild( flipToOptionEffect ) ;
            
            
            flipToFrontEffect = new FlipEffect( sillajOptions, sillajAsset ) ;
            sprite.addChild( flipToFrontEffect ) ;
            */
            /*gestion des échanges avec la base de données*/
            //sillajSession = new SillajSession( optionsXML.url, optionsXML.user, optionsXML.psw ) ;
        } 
        
 
        

        
        
        
        
        /**
        * flip widget to show option panel
        */ 
        private function flipToOption( e:MouseEvent ):void
        {
            //flipToOptionEffect.flipMe() ;
        }
        
        /**
        * affiche la face principale si tous les champs sont bien saisis
        */ 
        private function flipToFront( e:MouseEvent ):void
        {
            /*
            if( isOptionsOK() )
            {
                majOptions() ;
                flipToFrontEffect.flipMe() ;
            }
            */
        }
        
        
        /**
        * affiche le mode plus
        */
        private function bt_plus_onClick( e:MouseEvent ):void
        {
            /*
            if( isOpen )
            {
                sillajAsset.gotoAndPlay( 'close' ) ;
            }
            else
            {
                sillajAsset.gotoAndPlay( 'open' ) ;
            }
            
            isOpen = !isOpen ;
            */
            //this.height = sillajAsset.height ;
        } 
        
        /**
        * ferme la fenêtre
        */ 
        private function bt_close_onClick( e:MouseEvent ):void
        {
           this.close() ; 
        }
        
        
        
        /**
        * chargement le fichier des options
        */
        private function loadOptions():void
        {
            var optionFile:File = File.applicationStorageDirectory.resolvePath( "sillaj.xml" ) ;
            
            var fileStream:FileStream = new FileStream() ;
            
            //ouverture en lecture si le fichier existe, en écriture pour création dans le cas contraire
            if( optionFile.exists )
            {
                fileStream.open( optionFile, FileMode.READ ) ;     
/*                
                optionsXML = XML( fileStream.readUTFBytes( fileStream.bytesAvailable ) ) ;
                
                sillajOptions.ti_url.text    = optionsXML.url ;
                sillajOptions.ti_user.text = optionsXML.user ;
                sillajOptions.ti_psw.text = optionsXML.psw ;
                
                if( isOptionsOK() )
                {
                    sillajOptions.visible = false ;                    
                }
                else
                {
                    sillajAsset.visible = false ;
                }
                
*/           
            }
            else
            {
                fileStream.open( optionFile, FileMode.UPDATE ) ;

                var xml:XML = <options><url></url><user></user><psw></psw></options>; 
 
                var outputString:String = '<?xml version="1.0" encoding="utf-8"?>\n'; 
                outputString += xml.toXMLString(); 
     
                fileStream.writeUTFBytes(outputString); 
                
                //on masque la fenetre principale pour afficher les options
                //sillajAsset.visible = false ;
            }
                                   
            fileStream.close() ;
            
        } 
        
        
        /**
        * test si les valeurs en fichier sont différentes de celle inscrites, si oui, mise à jour fichier
        */ 
        private function majOptions():void
        {
            /*
            if(          optionsXML.user == sillajOptions.ti_user.text 
                    && optionsXML.psw == sillajOptions.ti_psw.text
                    && optionsXML.url   == sillajOptions.ti_url.text )
            {
                return ;
            }
            else
            {
                trace( "avant : " + optionsXML ) ;
                var optionFile:File = File.applicationStorageDirectory.resolvePath( "sillaj.xml" ) ;
            
                var fileStream:FileStream = new FileStream() ;
            
                fileStream.open( optionFile, FileMode.UPDATE ) ;

                var xml:String = "<options><url>" + sillajOptions.ti_url.text + "</url>" ;
                xml += "<user>" + sillajOptions.ti_user.text + "</user>" ;
                xml += "<psw>" + sillajOptions.ti_psw.text+ "</psw></options>" ; 
 
                var outputString:String = '<?xml version="1.0" encoding="utf-8"?>\n'; 
                outputString += xml ;
     
                fileStream.writeUTFBytes(outputString); 
                                                   
                fileStream.close() ;
                
                optionsXML = XML( xml ) ;
                
                trace( "apres : " + optionsXML ) ;
                
            }
            */
        } 
        
        
        /**
        * controle que tous les champs des options sont bien renseignées
        * @return Boolean false si pas bon
         
        private function isOptionsOK():Boolean
        {
           var isOK:Boolean = true ;
            
            if( sillajOptions.ti_url.text == "" || sillajOptions.ti_url.text == "obligatoire" )
            {
                sillajOptions.ti_url.text = "obligatoire" ;
                isOK = false ;      
            }
            
            if( sillajOptions.ti_user.text == "" || sillajOptions.ti_user.text == "obligatoire" )
            {
                sillajOptions.ti_user.text = "obligatoire" ;
                isOK = false ;      
            }

            if( sillajOptions.ti_psw.text == "" || sillajOptions.ti_psw.text == "obligatoire" )
            {
                sillajOptions.ti_psw.text = "obligatoire" ;
                isOK = false ;      
            }
            
            return isOK ;
                        
        }
        */
        
        
        /**
        * retour de la requete
         
        private function loadProject_onComplete( e:SillajEvent ):void
        {
            sillajAsset.combo_haut.dataProvider = e.dp ;    
        } 
*/

//todo voir pour supprimer cette méthode
        /**
        * chargement des activités d'un projet donné sélectionné dans la combo du haut
        
        private function loadActivity( e:Event ):void
        {   
            trace( e.target.selectedItem.projectId ) ;
                     
            var urlVariable:URLVariables = new URLVariables() ;
            urlVariable.categ = e.target.selectedItem.projectId ;
            urlVariable.func  = "tri_tache" ;
            
            var urlRequest:URLRequest = new URLRequest( "http://localhost:8888/requete.php" ) ;
            urlRequest.data = urlVariable ;
            
            activityLoader = new URLLoader() ;
            activityLoader.addEventListener( Event.COMPLETE, activityLoader_onComplete ) ;
            
            activityLoader.load( urlRequest ) ;
        } 
*/
        /**
        * chargement des activités d'un projet donné terminée
        
        private function activityLoader_onComplete( e:Event ):void
        {
            e.target.removeEventListener( Event.COMPLETE, activityLoader_onComplete ) ;
            
            sillajAsset.combo_bas.removeAll() ;
            
            var xml:XML = XML( e.target.data ) ;

            var len:uint =  xml.children().length()  ;

            var dp:DataProvider = new DataProvider() ;
            
            var obj:Object ;
            
            for( var i:uint = 0 ; i < len ; i++ )
            {
                obj = new Object() ;
                obj.label       = xml.row[i].field[0] ;
                obj.projectId = xml.row[i].field[1] ;
                
                dp.addItem( obj ) ;    
            }

            sillajAsset.combo_bas.dataProvider = dp ;
        }
                */ 
        
        /**
        * survol du widget
         
        private function onMouseOver( e:MouseEvent ):void
        {
            
        }
        private function onMouseDown( e:MouseEvent ):void
        {
            sillajAsset.startDrag( ) ;
        }
        
        */

    }
}